<?php

include_once 'data/functions.php';
include_once 'data/DataModel.php';
include_once 'data/DataMapper.php';

class Model
{
    protected static $models = array(
        'member'    => 'Member',
        'category'  => 'Category',
        'yaku'      => 'Yaku',
        'link'      => 'Link',
        'song'      => 'Song',
        'hito'      => 'Hito',
        'item'      => 'Item',
    );
    
    public function loadModels ($param=array())
    {
        if (! is_array($param)) {
            $param = array($param);
        }
        
        foreach ($param as $val) {
            if (! isset(self::$models[$val])) {
                die("未登録モデル");
            } else {
                require_once 'models/'.self::$models[$val].'.php';
                require_once 'models/'.self::$models[$val].'Mapper.php';
            }
        }
        
    }
}

class modelLoader
{
    protected
    /*
        
        $where,
     * 
     */
        
        $model, //使用するモデル
        
        $order,                 //検索用オーダー
        $offset,                //検索用オフセット
        $limit = PER_PAGE_COUNT,//検索用リミット
        $alike,                 //検索用ワード
        
        $isEdit = false,        //編集モード
        $returning,             //リザルトを返すオブジェクト名
        
        $targetId = 'id',       //マッパーで指定するIDカラム名
        $solo,                  //1行取得時の指定ID
        $mapperParameters,      //マッパーに渡したい値の配列
        
        $formParameters       = array(),    //postからmodelに渡すパラメーター配列
        
        $targetChoiceFunction = 'findById', //1行取得マッパー関数名
        $targetSelectFunction = 'find',     //複数行取得マッパー関数名
        $targetInsertFunction = 'insert',   //インサートマッパー関数名
        $targetUpdateFunction = 'update',   //アップデートマッパー関数名
        $targetDeleteFunction = 'delete',   //デリートマッパー関数名
        $targetCustomFunction               //インサート・アップデート・デリートマッパー関数名
    ;

    function __get($prop)
    {
        if (!property_exists($this,$prop)) {
            throw new InvalidArgumentException($prop.'は存在しません');
        }
        return $this->$prop;
    }
    
    function addMapperParameter($key, $value)
    {
        $this->mapperParameters[$key] = $value;
    }

    function __set($prop, $val)
    {
        if (!property_exists($this,$prop)) {
            throw new InvalidArgumentException($prop.'はセットできません');
        }
        
        if ($prop == 'order') {
            if (is_array($val)) $val = implode(',',$val);
            
        } else if ($prop == 'alike') {
            if (is_array($val)) $val = implode(' ',$val);
        }
        
        $this->$prop = $val;
    }
}
